Test Double
別名Imposterパターン
依存しているコードが使えないときでも、独立してロジックの検証をしたい。
スローテストを避けたい
映画業界では、主役の俳優が演じるにはリスクのあることや危険なことを撮影するのに、「スタントダブル」を雇う。スタントダブルはシーンの特定の要件を満たすことができる高度な訓練を受けた人だ。彼らは演技はできないけど、高所から落下したり、車を衝突させたり、そのシーンで要求されるものは何でもこなすことができる。スタントダブルが本物の俳優に似ている必要があるかどうかは、シーンの特性による。通常は、役者の背格好が似ている人が代わりになるように配役する。
いつ使うか
テストダブルを使う状況
テストダブルのバリエーション
https://gyazo.com/3324c71f8c5572b6dd95d39b04e5fe5b
テストスタブ
SUTが依存する実コンポーネントを置き換えて、SUTの間接入力をテストする。
テストスパイ
テストスタブと同じように、SUTの間接出力がどうなっているかを調べるために使う。SUT動作後に検証するために、この間接出力を保存しておく。
モックオブジェクト
SUTが実行されたときの間接出力を検証するためのオブジェクト。SUTに値を返しもするので、テストスタブの機能も含んでいるが、間接出力の検証に力点がある。
フェイクオブジェクト
SUTの依存コンポーネントが遅い、副作用があってテスト環境では使えない(使いにくい)場合に、それを置き換える。
例えば、データベースアクセスをインメモリハッシュテーブルにする、等。
ダミーオブジェクト
SUTのメソッドシグネチャの中には、パラメータとしてオブジェクトを受け取るものもある。テストもSUTもこれらのオブジェクトを気にしない場合は、ダミーオブジェクトを渡すことも選択肢としてアリだが、これは代役を果たすわけではなく、単に「なんでもいい」だけなので、テストダブルとは言えないかもしれない。
テストダブルの実装
設定なしのテストダブル
ダミーオブジェクトとフェイクオブジェクトは、設定が不要でそのままSUTで使う。
ハードコードのテストダブル
テストダブルが1つのテストでしか使わないのであれば、テストダブルは(テストスタブのために)特定の値を返したり、(モックオブジェクトの)特定のメソッド呼び出しを期待したりするのをハードコードしてしまえばよい。
設定可能なテストダブル
同じテストダブルをいくつかのテストで使いまわしたければ、テストダブルを設定可能にしておくのが良いだろう。